package com.atguigu.tingshu.user.api;

import cn.hutool.core.bean.BeanUtil;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.login.GuiGuLogin;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.user.UserInfo;
import com.atguigu.tingshu.user.service.UserInfoService;
import com.atguigu.tingshu.vo.user.UserInfoVo;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.language.bm.Rule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.lang.annotation.Retention;
import java.util.Map;

@Tag(name = "微信授权登录接口")
@RestController
@RequestMapping("/api/user/wxLogin")
@Slf4j
public class WxLoginApiController {

    @Autowired
    private UserInfoService userInfoService;

    @Autowired
    private RedisTemplate redisTemplate;




    /**
     * 更新用户信息
     * api/user/wxLogin/updateUser
     *
     */
    @PostMapping("/updateUser")
    @GuiGuLogin
    public Result updateUser(@RequestBody UserInfoVo userInfoVo,@RequestHeader String token){
        //获取用户ID
        Long userId = AuthContextHolder.getUserId();
        //封装数据
        userInfoVo.setId(userId);
        userInfoService.updateUser(userInfoVo,token);
        return Result.ok();
    }



    /**
     * 获取登录用户信息
     * 注意：redis-mysql 一致性问题
     * 1.消息队列同步
     *  mysql --->消息 --->rabbitmq--->监听器--->更新redis
     * 2.延时双删--不是特别合适
     *  redis如果删除---退出状态
     * 3.同步方案canal--mysql主从负责
     *  mysql（主）---binlog日志（体现）-----canal(伪装从节点)-----同步redis
     *
     * api/user/wxLogin/getUserInfo
     * @return
     */
//    @GetMapping("/getUserInfo")
//    public Result<UserInfoVo> getUserInfo(@RequestHeader String token){
//
//        //定义存储key
//        String loginKey= RedisConstant.USER_LOGIN_KEY_PREFIX+token;
//        //获取数据
//        UserInfoVo userInfoVo = (UserInfoVo) redisTemplate.opsForValue().get(loginKey);
//
//        return Result.ok(userInfoVo);
//
//
//    }


    /**
     * api/user/wxLogin/getUserInfo
     * @return
     */
    @GetMapping("/getUserInfo")
    @GuiGuLogin
    public Result<UserInfoVo> getUserInfo(){

        //获取用户ID
        Long userId = AuthContextHolder.getUserId();
        //获取用户信息
        UserInfo userInfo = userInfoService.getById(userId);

        return Result.ok(BeanUtil.copyProperties(userInfo,UserInfoVo.class));


    }






    /**
     * 小程序授权登录
     * api/user/wxLogin/wxLogin/{code}
     * @param code
     * @return
     */
    @GetMapping("/wxLogin/{code}")
    public Result<Map<String,String>> wxLogin(@PathVariable String code){

        Map<String,String> mapToken=  userInfoService.login(code);

        return Result.ok(mapToken);
    }




}
